package com.ning.weixin.mapper;

import com.ning.weixin.entity.UserInfo;
import org.apache.catalina.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * 用户信息dao层
 *
 * @author Cyan
 * @Date:2018/12/10
 */
@Mapper
public interface UserInfoMapper {

    //将签到打卡的积分累加求和分为3步,
    //如下所示

    /**
     * 1.根据用户openId查询用户信息
     *
     * @param openId
     * @return
     */
    UserInfo findUserInfo(@Param("openId") String openId);

    //2.在java逻辑代码中实现积分的加法

    /**
     * 3.更新新的积分
     *
     * @param userInfo
     */
    void updateScore(UserInfo userInfo);

    /**
     * 用户信息的保存有以下步骤:
     * 1.用户扫码进入公众号可以获取用户的openId,微信头像,微信昵称,另外userId和createTime生成
     * 2.用户打卡获取score和clockAddress并更新同时打卡次数 - 1,clockTime生成
     * 3.用户填写领奖信息userName和userTel保存到数据库中
     * 4.分享一次时线上打卡次数+1,线下打卡次数+10
     * 5.再次进行签到打卡重复第三步
     */

    /**
     * 保存用户基本信息
     * 用户的基本信息以对象形式进行保存
     *
     * @param userInfo
     */
    void saveUserInfo(UserInfo userInfo);

    /**
     * 用户更新保存真实姓名+电话号码
     *
     * @param userInfo
     */
    void updateNameAndTel(UserInfo userInfo);

    /**
     * 用户分享导致分享状态变为1
     * 线上线下打卡次数均增加
     *
     * @param userInfo
     */
    void updateShareStatus(UserInfo userInfo);

    /**
     * 线上线下打卡次数减少的逻辑如下
     * 1.先查询线上线下打卡次数
     * 2.判断该次数是否大于0
     * 3.在大于0的情况下减去1
     */

    /**
     * 线上打卡次数减去1
     *
     * @param userInfo
     */
    void subClockNum(UserInfo userInfo);

    /**
     * 线下打卡次数减去1
     *
     * @param downClockNum
     * @param openId
     */
    void subDownClockNum(@Param("downClockNum") Integer downClockNum,
                         @Param("openId") String openId);

    /**
     * 查询所有用户的头像，昵称，积分
     * 并按照积分进行排名
     */
    List<Map<String, Object>> getScoreRank();

    /**
     * 个人积分排名
     * @param openId
     * @return
     */
    Integer scoreRanking(String openId);

    /**
     * 查询用户所有信息
     * @return
     */
    List<UserInfo> selectUserInfo();

    /**
     * 分享状态，线上打卡全部重置
     */
    void updateStatusAndClockNum(UserInfo userInfo);

}
